package com.haibeimohe.handler;

import com.haibeimohe.config.RpcRequest;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

/**
 * 自定义事件处理器
 * @author hassan
 */
public class UserClientHandler extends ChannelInboundHandlerAdapter implements Callable {

    /**
     *  1.定义成员变量
     *  事件处理器上下文对象(存储handler,写操作)
     */
    private ChannelHandlerContext context;

    /**
     * 记录服务器返回的数据
     */
    private String result;

    /**
     * 记录将要发送给服务器的数据
     */
    private RpcRequest rpcRequest;

    /**
     * 2.实现ChannelActive 客户端和服务器连接时,该方法自动执行
     * @param context
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext context) throws Exception {
        // 初始化ChannelHandlerContext
        this.context = context;
    }

    /**
     * 3.实现channelRead 读到服务器数据,该方法自动执行
     * @param context
     * @param msg
     * @throws Exception
     */
    @Override
    public synchronized void channelRead(ChannelHandlerContext context, Object msg) throws Exception {
        // 将读到的服务器的数据msg,设置为成员变量
        result = msg.toString();
        notify();
    }

    /**
     * 4.将客户端的数据写到服务器
     * @return
     * @throws Exception
     */
    @Override
    public synchronized Object call() throws Exception {
        context.writeAndFlush(rpcRequest);
        wait();
        return result;
    }

    /**
     * 5.设置参数的方法
     * @param rpcRequest
     */
    public void setParam(RpcRequest rpcRequest) {
        this.rpcRequest = rpcRequest;
    }
}
